Appearance
Python 使用 Selenium 抓取网页动态内容
背景
今年一直都在做 AI
相关的应用,自然接触 python
语言的机会也多了很多,也做了一些爬虫相关的工作,常用的例如 Scrapy
、 Selenium
等框架。
这里记录下 Selenium
如何动态抓取网页动态内容。
Selenium 介绍
Selenium
是一种用于自动化网页应用的工具集。它可以用来测试网页应用、爬取网页数据、模拟浏览器行为等。
Selenium
的主要优点包括:
- 支持多种浏览器,包括
Chrome
、Firefox
、Edge
、Internet
Explorer
等。 - 支持多种编程语言,包括
Python
、Java
、C#
、JavaScript
等。 - 易于使用,入门简单。
- 功能强大,可以满足各种自动化需求。
Selenium
的主要缺点包括:
- 需要安装浏览器驱动程序才能使用。
- 某些操作需要使用
JavaScript
来实现。 - 在某些情况下,自动化脚本可能会失败
安装环境
bash
pip install selenium
实战
介绍
任务:抓取讯飞文档文件列表,并截图
进入首页需要以下步骤:
- 进去讯飞文档登录页
- 隐私协议弹框同意
- 自动填入账号密码并登录
- 进入讯飞文档首页,等待首页数据加载后截图
代码实践
Click me to view the code
python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from time import sleep
browser = webdriver.Edge()
# 设置浏览器窗口大小
browser.set_window_size(1200, 800)
browser.get('https://iflydocs.com/i/#/dashboard')
# 智能等待,在设置时间范围内,只要条件成立,马上结束等待, implicitly_wait
# 设置隐式等待时间为10秒 (看网速)
browser.implicitly_wait(10)
# 等待登录的输入框显示,默认等待 20s
WebDriverWait(browser,20).until(expected_conditions.visibility_of(browser.find_elements(By.CSS_SELECTOR,'.el-input__inner')[0])
)
# .el-button--primary 有两个按钮 第一个是登录按钮 第二个是隐私政策按钮
su_buttons = browser.find_elements(By.CSS_SELECTOR, '.el-button--primary')
# 说明有用户隐私协议弹框
if len(su_buttons) == 2:
# 模拟用户隐私政策同意
su_buttons[1].click()
# 同意用户协议的 checkbox
checkbox = browser.find_element(By.CSS_SELECTOR, '.el-checkbox__original')
# 点击这个原生即可
checkboxEl = browser.find_element(By.CSS_SELECTOR, '.el-checkbox')
if checkbox.is_selected() == False:
checkboxEl.click()
# 填写用户信息
kw_inputs = browser.find_elements(By.CSS_SELECTOR, '.el-input__inner')
kw_inputs[0].send_keys('xxxx')
kw_inputs[1].send_keys('xxxx')
# 登录
su_buttons[0].click()
# 创建显示等待对象
wait_obj = WebDriverWait(browser, 10)
# 设置等待条件(等搜索结果的div出现)
# 这里设置等待用户头像出现
wait_obj.until(
expected_conditions.presence_of_element_located(
(By.CSS_SELECTOR, '.doc-item')
)
)
# 等待1s
sleep(1)
# 截屏
browser.get_screenshot_as_file('python_result.png')